package com.yuw.converter;

import org.apache.commons.beanutils.Converter;

import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class DateTimeConverter implements Converter {
    // 常用日期类型的格式串
    private static final String DATE = "yyyy-MM-dd"; // 长度为10
    private static final String DATETIME = "yyyy-MM-dd HH:mm"; // 长度为16
    private static final String DATETIME1 = "yyyy-MM-dd HH:mm:ss"; // 长度为19
    private static final String TIMESTAMP = "yyyy-MM-dd HH:mm:ss.SSS"; // 长度为23

    // 把 o 转化为 aClass类型： 此处是把 String 转换 Date类型
    @Override
    public <T> T convert(Class<T> aClass, Object o) {
        // 将 o --> aClass
        // form表单的字符串转换为实体bean的属性值的目标类型
        return (T) toDate(aClass, o);
    }

    /**
     * 将字符串转换为对应格式的Date对象
     *
     * @param type  目标类型
     * @param value 转换的值
     * @return Date对象
     */
    public static <T> T toDate(Class<T> type, Object value) {
        if (value == null || "".equals(value))
            return null; // 默认返回null

        // 判断被转换的对象值是不是String类型
        if (value instanceof String) {
            // 获取转换的对象的字符串
            String dateValue = value.toString().trim();
            // 被转换字符串的长度
            int length = dateValue.length();
            // 判断被转换的类型是不是时间类型

            // 判断转换的目标类型是不是 Date
            // 转换情景1： String --> java.util.Date
            if (type.equals(java.util.Date.class)) {
                // 把 String（form表单） 转换为 Date（实体类）
                try {
                    DateFormat formatter = null;
                    // 转换为“yyyy-MM-dd”格式的Date对象
                    if (length <= 10) {
                        formatter = new SimpleDateFormat(DATE, new DateFormatSymbols(Locale.CHINA));
                    } else
                        // 转换为“yyyy-MM-dd HH:mm”格式的Date对象
                        if (length <= 16) {
                            formatter = new SimpleDateFormat(DATETIME, new DateFormatSymbols(Locale.CHINA));
                        } else
                            // 转换为“yyyy-MM-dd HH:mm:ss”格式的Date对象
                            if (length <= 19) {
                                formatter = new SimpleDateFormat(DATETIME1, new DateFormatSymbols(Locale.CHINA));
                            } else
                                // 转换为“yyyy-MM-dd HH:mm:ss.SSS”格式的Date对象
                                if (length <= 23) {
                                    formatter = new SimpleDateFormat(TIMESTAMP, new DateFormatSymbols(Locale.CHINA));
                                }

                    return (T) formatter.parse(dateValue); // 把字符串转换为日期类型Date
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 转换情景2： String --> java.time.LocalDateTime
            else if (type.equals(java.time.LocalDateTime.class)) {
                DateTimeFormatter fmt = null;
                // 转换为“yyyy-MM-dd”格式的Date对象
                if (length <= 10) {
                    // 如果日期类型长度小于10 则添加时间部分
                    dateValue += " 00:00:00";
                    length = dateValue.length();
                }

                // 转换为“yyyy-MM-dd HH:mm”格式的Date对象
                if (length <= 16) {
                    fmt = DateTimeFormatter.ofPattern(DATETIME);
                } else
                    // 转换为“yyyy-MM-dd HH:mm:ss”格式的Date对象
                    if (length <= 19) {
                        fmt = DateTimeFormatter.ofPattern(DATETIME1);
                    } else
                        // 转换为“yyyy-MM-dd HH:mm:ss.SSS”格式的Date对象
                        if (length <= 23) {
                            fmt = DateTimeFormatter.ofPattern(TIMESTAMP);
                        }
                return (T) LocalDateTime.parse(dateValue, fmt);
            }

        }
        return (T) value;
    }


//    public static void main(String[] args) {
//        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
//        String str = "2019-08-03";
//        LocalDateTime date = LocalDateTime.parse(str, fmt);
//        System.out.println("String转LocalDate::" + date);
//
//        //////////////////////
//
//    }
}
